package com.example.demo.http;

import org.apache.http.message.BasicNameValuePair;

import java.math.BigDecimal;
import java.util.*;

/**
 * 类说明：http请求表单参数类
 *
 * @author Jianhui Lu
 * @createtime 2017年5月27日 下午3:31:06
 */
public class Form implements Iterable<BasicNameValuePair> {
    /**
     * 参数集合
     */
    private List<BasicNameValuePair> params = new ArrayList<>();

    @Override
    public Iterator<BasicNameValuePair> iterator() {
        return params.iterator();
    }

    /**
     * 获取参数的个数
     *
     * @return
     * @createtime 2017年5月27日下午3:34:15
     * @author Jianhui Lu
     */
    public int size() {

        return params.size();
    }

    /**
     * 判断表单参数是否为空
     *
     * @return
     * @createtime 2017年5月27日下午3:35:56
     * @author Jianhui Lu
     */
    public boolean isEmpty() {

        return params.isEmpty();
    }

    /**
     * 判断表单中是否包含该参数
     *
     * @param param
     * @return
     * @createtime 2017年5月27日下午3:45:27
     * @author Jianhui Lu
     */
    public boolean contains(BasicNameValuePair param) {

        return params.contains(param);
    }

    /**
     * 判断表单中是否包含指定但参数集
     *
     * @param params
     * @return
     * @createtime 2017年5月27日下午3:46:23
     * @author Jianhui Lu
     */
    public boolean containsAll(Collection<?> params) {
        return this.params.containsAll(params);
    }

    /**
     * 获取指定参数
     *
     * @param index
     * @return
     * @createtime 2017年5月27日下午3:47:30
     * @author Jianhui Lu
     */
    public BasicNameValuePair get(int index) {

        return params.get(index);
    }

    /**
     * 添加表单参数
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:50:24
     * @author Jianhui Lu
     */
    public Form add(String name, String value) {

        params.add(new BasicNameValuePair(name, value));
        return this;
    }

    /**
     * 添加表单参数 Boolean型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:52:58
     * @author Jianhui Lu
     */
    public Form add(String name, Boolean value) {

        return add(name, value.toString());
    }

    /**
     * 添加表单参数 Double型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:54:15
     * @author Jianhui Lu
     */
    public Form add(String name, Double value) {
        return add(name, value.toString());
    }

    /**
     * 添加表单参数 Long型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:55:12
     * @author Jianhui Lu
     */
    public Form add(String name, Long value) {
        return add(name, value.toString());
    }

    /**
     * 添加表单参数 Integer型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:55:40
     * @author Jianhui Lu
     */
    public Form add(String name, Integer value) {
        return add(name, value.toString());
    }

    /**
     * 添加表单参数 BigDecimal型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:56:41
     * @author Jianhui Lu
     */
    public Form add(String name, BigDecimal value) {
        return add(name, value.toString());
    }

    /**
     * 添加表单参数 Date型
     *
     * @param name
     * @param value
     * @return
     * @createtime 2017年5月27日下午3:57:42
     * @author Jianhui Lu
     */
    public Form add(String name, Date value) {
        return add(name, value.getTime());
    }

    /**
     * 添加表单参数 Null型
     *
     * @param name
     * @return
     * @createtime 2017年5月27日下午3:58:27
     * @author Jianhui Lu
     */
    public Form addNull(String name) {
        return add(name, (String) null);
    }

    /**
     * 获得参数集合的值，即当集合为空时返回null，集合有仅且仅有一个参数时返回该参数，否则返回集合本身
     *
     * @return
     * @createtime 2017年5月27日下午3:59:59
     * @author Jianhui Lu
     */
    public Object value() {
        switch (size()) {
            case 0:
                return null;
            case 1:
                return params.get(0);
            default:
                return params;
        }
    }

    /**
     * 返回参数集合
     *
     * @return
     * @createtime 2017年5月27日下午4:04:12
     * @author Jianhui Lu
     */
    public List<BasicNameValuePair> values() {
        return params;
    }

    @Override
    public String toString() {
        Object value = value();
        return value == null ? "()" : value.toString();
    }

}
